/*
    HTTP中，对于URL需要进行编解码，原因如下：
    {
        第一个原因，例如：url：www.baidu.com?canshu1=zhi1&canshu2=zhi2

        我们从url中获取参数值的方法是从=后获取值，针对这个链接，我们从链接中获取参数。有两种情况

        1.参数有两个canshi1 canshu2，值分别是zhi1和zhi2

        2.参数只有一个canshu1 值为zhi1&canshu2=zhi2

        也就不进行编码的话，取值是有问题的
    }

    {
        在因特网上传送URL，只能采用ASCII字符集，中文等会自动编码导致问题
    }

    {
        URL编码通常也被称为百分号编码（percent-encoding），是因为它的编码方式非常简单：
    使用%加上两位的字符——0123456789ABCDEF——代表一个字节的十六进制形式。
    URL编码要做的，就是将每一个非安全的ASCII字符都被替换为“%xx”格式，
    对于非ASCII字符，RFC文档建议使用utf-8对其进行编码得到相应的字节，然后对每个字节执行百分号编码。
    如"中文"使用UTF-8字符集得到的字节为0xE4 0xB8 0xAD 0xE6 0x96 0x87，
    经过Url编码之后得到"%E4%B8%AD%E6%96%87"

    }  
*/

#ifndef URLENCODERANDDECODER
#define URLENCODERANDDECODER

#include "HTTPRelated.h"

class urlEncoderAndDecoder
{
private:
    // 十六进制转换 hex是十六进制的意思
    unsigned char charToHex(unsigned char x);
    unsigned char hexToChar(unsigned char x);

public:
    urlEncoderAndDecoder() = default;
    ~urlEncoderAndDecoder() = default;
    urlEncoderAndDecoder(urlEncoderAndDecoder& coder) = delete;
    urlEncoderAndDecoder(urlEncoderAndDecoder&& coder) = delete;
    urlEncoderAndDecoder& operator=(urlEncoderAndDecoder& coder) = delete;
    urlEncoderAndDecoder& operator=(urlEncoderAndDecoder&& coder) = delete;

    std::string encoder(const std::string& url) noexcept(false);
    std::string decoder(const std::string& url) noexcept(false);
};



#endif